package middle;

/**
 * 你是一个专业的小偷，计划偷窃沿街的房屋，每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ，这意味着第一个房屋和最后一个房屋是紧挨着的。
 * 同时，相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警 。
 *
 * 给定一个代表每个房屋存放金额的非负整数数组，计算你 在不触动警报装置的情况下 ，今晚能够偷窃到的最高金额。
 *
 * 链接：https://leetcode.cn/problems/house-robber-ii
 * @author 胡宇轩
 * @Email: programboy@163.com
 */
public class HouseRobberII {
    /**
     * 该题基于HouseRobber
     * 这道题的解决就需要分场景去做
     * */
    class Solution {
        public int rob(int[] nums) {
            if (nums.length == 1) {
                return nums[0];
            } else if (nums.length == 2) {
                return Math.max(nums[0], nums[1]);
            }
            return Math.max(robRange(nums, 0, nums.length-1), robRange(nums, 1, nums.length));
        }

        public int robRange(int[] nums, int start, int end) {
            int stealVal = nums[start];
            int notStealVal = 0;
            // 重点就是维护两个最大的值（偷和不偷的两个最大值）
            int maxVal = stealVal;
            int notMaxStealVal = 0;
            for (int i = start+1; i < end; i++) {
                int temp = stealVal;
                stealVal = notMaxStealVal + nums[i];
                notStealVal = temp;
                maxVal = Math.max(stealVal, maxVal);
                notMaxStealVal = Math.max(notStealVal, notMaxStealVal);
            }
            return maxVal;
        }
    }
}
